/***************************************************************************************************
Universidad del Valle de Guatemala
Algoritmos y estructuras de datos
Karen Tojin   08091
Fecha: 23 de Julio de 2009
Hoja de Trabajo No. 2
Descricion: Programa que simula un parqueo, con el uso de pilas y dos diferentes implementaciones
****************************************************************************************************/

/**
 *
 * @author karenAndy
 */
import java.util.ArrayList;
import java.util.Scanner;

public class Driver {

    public static void main(String[] args){
        int op=0;
        Scanner input = new Scanner(System.in);
        SortedList newSortedList;

        do{
            //Main menu
            System.out.println("\t\t.::: Huffman Tree :::.");
            System.out.println();
            System.out.println("1. Ingresar cadena para codificar");
            System.out.println("2. Salir del programa");

            System.out.print("\nIngrese la opcion que desea realizar: ");
            try{
                op=input.nextInt();
            }
            catch(Exception excep){
                System.out.print("\nOpción inválida");
                op=2;
            }
            //Defensive programming
            while(op<1 || op>2){
                System.out.print("\nOpción incorrecta. Ingrese la opcion que desea realizar: ");
                op=input.nextInt();
            }
            switch(op){
                //En caso de que la opción sea ingresar una cadena para codificar
                case 1:
                {
                    System.out.print("\nIngrese una cadena para codificar: ");
                    String stringInput=input.next();
                    
                    ArrayList<String> inputPhrase = new ArrayList<String>();
                    newSortedList = new SortedList();
                    //Adding the string input to a temporary arrayList
                    for(int i=0; i<stringInput.length(); i++){
                        inputPhrase.add(stringInput.charAt(i)+"");
                    }

                    //Cheking the inputPhrase and adding it to the newSortedList
                    do{
                        String temp=inputPhrase.get(0);
                        int frequencies=0;
                        for(int i=0; i<inputPhrase.size(); i++){
                            if(inputPhrase.get(i).compareTo(temp)==0){
                                frequencies++;
                                inputPhrase.remove(i);
                                if(inputPhrase.size()==0)
                                    break;
                                i--;
                            }
                        }

                        newSortedList.Push(new TreeNode(temp,frequencies));
                    }while(inputPhrase.isEmpty()==false);

                    //Creation of a new Huffman Tree
                    HuffmanTree newHuffmanTree = new HuffmanTree();
                    newHuffmanTree.NewTree(newSortedList);

                    //Printing the Huffman Tree Binary Code
                    for (int i=0;i<newHuffmanTree.getListTemp().size();i++){
                        System.out.println("\tCaracter: "+newHuffmanTree.getListTemp().get(i).getCharacter()+"\tFrecuencia: "+newHuffmanTree.getListTemp().get(i).getFrequency()+"\tCódigo: "+newHuffmanTree.getHufTree((String)newHuffmanTree.getListTemp().get(i).getCharacter())); 
                    }
                    System.out.println();
                }
                break;
           }
        }
        //Until the exit option is selected
        while(!(op==2));

        //Goodbay message
        System.out.println("\n\n\t.::Gracias por usar este programa::.");
    }
    
}
